MPLS VPN

简述

MPLS VPN基本架构拓扑
image_1d83uk98siqv159r174410e64h21j.png-75.1kB

在路由层面,客户A的站点1将到达本站点的路由信息通过MPLS VPN网络传递到远在另一个城市甚至另一个国家的站点2,反过来,站点2也是如此。对于客户而言,他们希望自己的站点路由在服务提供商的MPLS VPN网络内是不可见的,而且必须是独立传输、不会存在冲突的,他们不关心MPLS VPN骨干网络的具体形态。对于服务提供商而言,他们希望自己骨干网络内的传输设备能够专注于数据转发,而不参与客户路由的学习及交互,从而避免维护大规模路由表而导致设备负担过重。更重要是,MPLS VPN网络允许大量客户同时接入,且相互隔离。

在数据层面,当客户A的站点1将发往站点2的IP报文送入MPLS VPN骨干网络时,报文在MPLS VPN网络边界被压入标签头部,并最终被送达远端PE设备,再由该PE设备将其还原成IP报文后转发到该客户的站点2,显然,客户并不希望自己站点间相互通信的数据在MPLS VPN网络中被暴露,标签化的数据交互过程起到一定的安全作用,它使得共享式的MPLS VPN网络能够允许大量的客户同时接入,这些客户的数据不会在服务提供商的网络内出现冲突或者紊乱。

四种典型设备

PE(Provider Edge)设备:服务供应商边缘设备,一方接入MPLS VPN骨干网络P设备,另一方接入CE设备。用于客户两个站点间的路由信息交换。VRF(Virutual Routing and Forwarding)会部署在PE设备上来隔离不同客户路由。
P(Provider)设备:服务供应商设备,用于标签报文转发。
CE(Client Edge)设备:客户边界设备,一方连着PE设备,另一方连着C设备。用于将本区域内路由信息交给PE设备,并从PE设备学习远程站点的路由信息。一般与PE设备间启用动态路由协议来互相学习路由。
C(Client)设备:客户网络内部设备。

六个问题了解MPLS VPN

问题一

多个CE设备连接一个PE设备,PE设备同时学习多个CE路由,PE设备如何区分不同CE设备发送过来的相同路由条目?
image_1d83us0061qsg1svv66dft5vdp3a.png-93.9kB
答:
使用VRF。VRF(Virtual Routing and Forwarding),主要用于区分不同客户端的路由条目,PE设备上会为每一个客户创建一个VRF专门用于存储从该客户学习来的路由条目,以此防止客户间路由发送冲突。一个VRF相当于一个虚拟设备,拥有独立的路由表,FIB表,动态路由协议进程。上例中PE设备会创建两个VRF分别存储客户A和客户B的路由。


问题二

PE1需要将客户A在站点1的路由发送给PE2,如何实现?
答:
使用BGP协议。在客户连接的两个PE设备间建立BGP对等体关系,让PE1与PE2直接交换客户的路由信息,中间P设备无需使用BGP协议。这样不仅做到了将PE1的路由信息发送给PE2,而且还可以让MPLS VPN骨干网络的设备不用维护客户的路由,仅专注于数据的转发。


问题三

VRF用于实现客户路由隔离并解决IP地址空间冲突的问题,但是一旦PE1设备将路由条目发送出去又会出现不同客户的路由信息混淆的问题,如何对BGP所运载的路由进行区分呢?
答:
使用RD(Route Distinguisher)路由区分码。对路由信息进行封装,在原IPv4(32bit)路由前缀的基础上增加一个RD(64bit),一起封装成为VPNv4(96bit)路由进行传输。例如:64519:100:172.16.18.0/24 其中172.16.18.0/24为IPv4地址,64519:100为RD值。

传统的BGP协议无法运载VPNv4路由,需要使用MP-BGP(Multi-Protolocal BGP),使得BGP可以运载VPNv4路由、IPv6路由等。


现在解决了PE1从不同客户学习路由并且可以加以区分,以及怎样将路由信息发送到PE2。但是当路由到达PE2时,又出现了另一个问题,如何将路由信息区分,并放入不同的VRF?
image_1d83vbcsj66v1kt718ko1rfnfaa65.png-104.1kB


问题四

PE2如何区分从PE1学习到的路由条目并放入相应的VRF?
答:
使用RT(32bit)(Route Target)路由目标。
Export RT:发送路由器上设置。在PE1上为客户A设置Export值为64519:1,为客户B设置Export值为64520:2,这样PE1在发送VPNv4路由的时候会将RT值作为扩展Community属性一起发送给PE2。
Inport RT:接收路由器上设置。在PE2上为客户A设置Import值为64519:1,为客户B设置Inport值为64520:2,与发送端对应。这样PE2将RT值为64519:1的路由放进客户A的VRF中,RT值为64520:2的路由放进客户B的VRF中。
image_1d83vekbfeat16a9ackvu312d76v.png-224kB


到目前为止我们以及解决了路由信息的传递过程,但是由路由信息就一定可以传送数据吗?我们使用的是BGP协议,中间的P设备是不知道客户间路由的,所以一旦数据包发送出去,到了P设备就会被丢弃,因为P设备没有客户路由。貌似还查了一点,怎么让中间设备不管三层的目的地址,直接对数据包进行转发呢?一直在说MPLS VPN但是学到现在还没有使用到一点MPLS技术在里面,现在派上用场了。


问题五

如何让P设备在不知道目的地址的情况下对数据包进行转发?
答:
使用MPLS,让路由器根据标签转发数据。在MPLS VPN骨干网络设备上启用MPLS及LDP,并且在设备间建立LDP对等体关系,在此之前骨干区域要先实现互通。以PE1为例,PE2与各个P设备会为去往PE1的路由分配标签,并形成一条LSP,这样PE2的报文就可以沿着这条LSP传送到PE1。
image_1d83vhk7m77c4g01gvkdhp63786.png-79.6kB
image_1d83vhr2c149u1doi10vsdg1um18j.png-150.2kB


现在数据报文可以从PE2发送到PE1了,PE1收到报文后将标签弹出,然后将数据包进行转发。现在又出现了一个新的问题,因为数据包不是路由条目,路由条目可以根据扩展Community属性值发放到不同的VRF中,数据包不存在这个属性,所以PE1这时候又懵逼了,这个数据包该发送给客户A还是客户B?


问题六

PE设备收到数据包后,如何区分,并转发到相应的VRF中去?
答:
采用多层标签。MPLS标签包标签头可以有多个,按顺序排序,存储在标签栈中。在数据包发送时,为数据包压入两层标签,一层是外层标签或者叫公网标签,由LDP分发,用于将报文在MPLS VPN骨干网络传输。另一层是内部标签,也叫私网标签,由MP-BGP分发,用于将报文在PE设备上对应到具体的VRF中。为了实现私网标签的分发,PE2通过MP-BGP将VPNv4路由通告给PE1时,除了携带了该路由的RT值,还会将为该路由所分配的私网标签一并携带。这样PE1在发送数据包到PE2时会给数据包打上双层标签,使用公网标签将数据包发送到PE2,出去外层标签后,由于私网标签时PE2自己设置的,所以PE2会根据内层标签决定将数据包对应到哪一个VRF,最后私网标签弹出,将正常的IP报文传输给客户A或者B。


总结

通过上面六个问题的探讨,大致可以了解经典MPLS VPN的工作机制。总结一下,一个经典的MPLS VPN实现需要实现哪些功能:
1.在PE设备上,使用VRF来区分不同客户、维护不同客户的路由
2.在PE设备上,基于VRF使用路由协议实现与CE间的路由信息交换
3.在MPLS VPN骨干网络内部需要运行IGP路由协议,并在此基础上运行MPLS和LDP协议。
4.在PE之间需要建立BGP对等体,使用RD值将IPv4路由封装成VPNv4路由,通过MP-BGP传递VPNv4路由。
5.在PE上需要为VRF设置RT值区分接收到的路由条目。
6.为数据包压入双层标签,让数据包技能穿越MPLS VPN骨干网络,然后转发到相应的VRF中。